#ifndef PLC2LLVM_SYMBOLRECORD_H
#define PLC2LLVM_SYMBOLRECORD_H

#include <string>
#include <vector>
#include <set>

#include <plc2llvm/PLCSymbols/PLCSymbol.h>
class PLCSymbol;

class SymbolRecord {
private:
    //主符号是否存在，不存在则为”虚符号“，即弱存在
    bool ifExist;
    //符号共有名称
    std::string name;
    //本作用域的强符号,没有则为nullptr
    PLCSymbol* majorSymbol;
    //备选符号
    std::vector<PLCSymbol*> alternativeSymbols;
    //同名符号数量
    int alternativeCount;
    //查重使用，保留symbolList中symbol的symbol id
    std::set<int> idSet;
public:
    PLCSymbol *getMajorSymbol() const;

    void setMajorSymbol(PLCSymbol *majorSymbol);

    //创建一个record
    static SymbolRecord* makeRecord(std::string name, bool ifExist);

    //链接另一个record，将another中的符号列表按原来的顺序放在本符号列表的后面 比较symbol id去重，优先保留前面的
    //只会操作替补符号，主符号不会被操作
    void linkRecord(SymbolRecord* another);

    //添加备选符号
    void addAlternativeSymbol(PLCSymbol* alternativeSymbol);

    //返回第一优先级的符号
    PLCSymbol* getFirstAlternativeSymbol();

    bool isIfExist() const;

    void setIfExist(bool ifExist);

    int getAlternativeCount() const;

    void setAlternativeCount(int count);

    const std::string &getName() const;

    void setName(const std::string &name);

    const std::vector<PLCSymbol *> &getSymbolList() const;
};


#endif
